<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  
  <title>database | cll</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="description" content="Q：数据库分类A:1.关系型数据库（mysql，oracle，sqlserver），非关系型数据库（redis，memcache，mogodb，hadoop等）  Q:关系性数据库的三个范式，设计表时候遵循的规范A：要想满足第2范式，比较先满足第1范式；要想满足第3范式，比较先满足第2范式 A：1NF，列数据的不可分隔    2NF，主键    3NF，外键，如果一个表数据中不包含非主关键字信息">
<meta property="og:type" content="article">
<meta property="og:title" content="database">
<meta property="og:url" content="https://caoleili.gitee.io/cll-blog/2023/10/10/database/index.html">
<meta property="og:site_name" content="cll">
<meta property="og:description" content="Q：数据库分类A:1.关系型数据库（mysql，oracle，sqlserver），非关系型数据库（redis，memcache，mogodb，hadoop等）  Q:关系性数据库的三个范式，设计表时候遵循的规范A：要想满足第2范式，比较先满足第1范式；要想满足第3范式，比较先满足第2范式 A：1NF，列数据的不可分隔    2NF，主键    3NF，外键，如果一个表数据中不包含非主关键字信息">
<meta property="og:locale">
<meta property="article:published_time" content="2023-10-10T15:44:03.000Z">
<meta property="article:modified_time" content="2023-10-10T15:44:42.553Z">
<meta property="article:author" content="cll">
<meta name="twitter:card" content="summary">
  
    <link rel="alternate" href="/cll-blog/atom.xml" title="cll" type="application/atom+xml">
  
  
    <link rel="shortcut icon" href="/cll-blog/favicon.png">
  
  
    
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/typeface-source-code-pro@0.0.71/index.min.css">

  
  
<link rel="stylesheet" href="/cll-blog/css/style.css">

  
    
<link rel="stylesheet" href="/cll-blog/fancybox/jquery.fancybox.min.css">

  
  
<meta name="generator" content="Hexo 6.3.0"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/cll-blog/" id="logo">cll</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"><span class="fa fa-bars"></span></a>
        
          <a class="main-nav-link" href="/cll-blog/">Home</a>
        
          <a class="main-nav-link" href="/cll-blog/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
        
          <a class="nav-icon" href="/cll-blog/atom.xml" title="RSS Feed"><span class="fa fa-rss"></span></a>
        
        <a class="nav-icon nav-search-btn" title="Suche"><span class="fa fa-search"></span></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Suche"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="https://caoleili.gitee.io/cll-blog"></form>
      </div>
    </div>
  </div>
</header>

      <div class="outer">
        <section id="main"><article id="post-database" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
  <div class="article-meta">
    <a href="/cll-blog/2023/10/10/database/" class="article-date">
  <time class="dt-published" datetime="2023-10-10T15:44:03.000Z" itemprop="datePublished">2023-10-10</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="p-name article-title" itemprop="headline name">
      database
    </h1>
  

      </header>
    
    <div class="e-content article-entry" itemprop="articleBody">
      
        <ul>
<li><p>Q：数据库分类<br>A:1.关系型数据库（mysql，oracle，sqlserver），非关系型数据库（redis，memcache，mogodb，hadoop等）</p>
</li>
<li><p>Q:关系性数据库的三个范式，设计表时候遵循的规范<br>A：要想满足第2范式，比较先满足第1范式；要想满足第3范式，比较先满足第2范式</p>
<p>A：1NF，列数据的不可分隔</p>
<p>   2NF，主键</p>
<p>   3NF，外键，如果一个表数据中不包含非主关键字信息，需要引入外键</p>
<p>   反三范式：有的时候为了效率，可以设置重复的字段或者可以推到出字段，订单（总价）和订单项目</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：事务的四大特征是什么</p>
<p>A：并发的工作单位，不可分割(转账)，ACID特性</p>
<pre><code>原子性：表示操作事务内不可分割，要么都成功，要么都失败

一致性：要么都成功，要么都失败，失败来回滚

隔离性：一个事务开始后，不能受其他事务干扰

持续性：表示事务开始了就不能中止
</code></pre>
</li>
</ul>
<hr>
<ul>
<li><p>Q：mysql数据库的最大连接数</p>
<p>A：为什么需要最大连接数？特定服务器只能支持一定数目同时连接，这时需要我们设置最大连接数（最多同时服务多少连接），在数据库安装都会有一个默认的最大连接数，my.ini中max_connections&#x3D;100</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：&#x3D;&#x3D;触发器的使用场景&#x3D;&#x3D;</p>
<p>A:触发器有个触发条件，当条件达到了，会进行一些操作。 效率高</p>
<p>  create触发器</p>
<p>  把分隔符；改成|；创建触发器 trigger after insert article</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：mysql的分页和Oracle的分页（看自己项目代码）</p>
<p>A：为什么要分页，在很多数据，不可能完全显示数据，进行分段显示</p>
<p>mysql 使用 limit来分页的， limit offset，size表示从多少索引去多少位</p>
<p>oracle的分页，大部分情况下，我们是记不住的，说思路，要使用三层嵌套查询，如果在工作中使用了，可以到原来的项目中拷贝或上网查询</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：&#x3D;&#x3D;存储过程的优点&#x3D;&#x3D;：</p>
</li>
<li><p>A：</p>
<p>  只在创建的时候编译，提高执行速率</p>
<p>   负责业务多条sql语句时</p>
<p>   存储过程创建一次可重复使用</p>
<p>   安全性高</p>
<p>  如何创建</p>
</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">create procedure insert_student </span><br><span class="line">   </span><br><span class="line">   bengin</span><br><span class="line">   </span><br><span class="line">   end</span><br><span class="line">   call insert_student...</span><br></pre></td></tr></table></figure>
<hr>
<ul>
<li><p>Q:&#x3D;&#x3D;jdbc代码调用存储过程&#x3D;&#x3D;</p>
<p>A：加载驱动，获取连接，设置参数，执行，释放连接</p>
</li>
</ul>
<hr>
<pre><code>sql，跨表查询，连接查询
</code></pre>
<hr>
<ul>
<li><p>Q：简单说下对jdbc的理解<br>A:数据库连接关系系统是很多的，每个数据库管理系统的支持数据库的命令都是不一样的<br>  调用mysql语句插入数据 mysql Sever ×</p>
<p>  调用orcle的语句插入数据 oracle Sever ×</p>
<p>  1.对于普通开发人员不知道mysql或Oracle这样的数据库厂商的私有语言</p>
<p>  2.为了适用所有的数据库，需要定制多套代码</p>
<p>  3.java只定义接口，数据库厂商来实现接口，就是jdbc,开发者只需要导入对应厂商开发的实现即可。然后以接口的方式进行调用。（mysql+mysql驱动+jdbc）</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q:&#x3D;&#x3D;简单写一个访问oracle数据库的jdbc程序&#x3D;&#x3D;(网上找)</p>
<p>A：</p>
<p>加载驱动（com.mysql.jdbc.oracle.jdbc.driver.OracleDriver），</p>
<p>获取连接(DriverMangager,getConnect(URL,username,passward))，</p>
<p>设置参数 Statement </p>
<pre><code>    catmt.setXXX(index,value)，
</code></pre>
<p>执行excuteQuery excuteUpdate，</p>
<p>释放连接（释放连接要从小到大，必须放到finnally）</p>
</li>
</ul>
<hr>
<p> Q：什么是ORM</p>
<h2 id="A：对象关系映射，解决对象和关系数据库存在不匹配现象的框架，常见-Hibernate，mybitis-1-简单：-2-传达性-3-精准性-可以使用jdbc来映射，这样不好，使用ORM框架来解决"><a href="#A：对象关系映射，解决对象和关系数据库存在不匹配现象的框架，常见-Hibernate，mybitis-1-简单：-2-传达性-3-精准性-可以使用jdbc来映射，这样不好，使用ORM框架来解决" class="headerlink" title="  A：对象关系映射，解决对象和关系数据库存在不匹配现象的框架，常见 Hibernate，mybitis  1.简单：  2.传达性  3.精准性  可以使用jdbc来映射，这样不好，使用ORM框架来解决"></a>  A：对象关系映射，解决对象和关系数据库存在不匹配现象的框架，常见 Hibernate，mybitis<br><br>  1.简单：<br><br>  2.传达性<br><br>  3.精准性<br><br>  可以使用jdbc来映射，这样不好，使用ORM框架来解决</h2><ul>
<li><p>Q：ibatis（mybatis）和hibernate</p>
<p>A:都是ORM框架，屏蔽jdbc api访问细节</p>
<p>ibatis：将sql语句与java代码分离，提供了将结果集自动封装成为实体对象的对象的集合功能</p>
<p>hibernate:全自动orm工具，自动生成sql</p>
<p>不同：</p>
<p>1.hibernate比ibatis强大</p>
<p>2.hibernate不能写太过复杂的语句，ibatis可以</p>
<p>3.ibatis要比hibernate简单的多，ibatis是面向sql的，不考虑对象的映射关系</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：Hibernate映射对象的状态<br>A：</p>
<p>1.&#x3D;&#x3D;临时状态&#x3D;&#x3D;，瞬时状态 new 创建，没有在session中</p>
<p>2.&#x3D;&#x3D;持久化状态&#x3D;&#x3D;，托管状态：已经被持久化，加入到session的缓存中，session没有关闭改状态</p>
<p>3.&#x3D;&#x3D;游离状态&#x3D;&#x3D;：已经被持久化，但不在sesion中</p>
<p>4.删除状态</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q:介绍下Hibernate的缓存</p>
</li>
<li><p>A：为了提高访问速度，把磁盘或数据库访问变成内存访问</p>
<p>1.两大类：</p>
<p>Hibernate一级缓存，session级别的缓存；在事务范围内有效，内置的，不能卸载</p>
<p>Hibernate二级缓存，sessionFactory级别的缓存，用应用启动到结束，是可选，默认没有二级缓存，需要手动开启</p>
<p>保持数据库后，在内存中保存过一份，如果更新了数据库就要同步更新</p>
<p>2.什么数据适合存放到二级缓存中</p>
<p>1.很少被修改的数据（帖子的最后回复时间）</p>
<p>2.经常被查询的数据（电商的地点）</p>
<p>3.常量数据</p>
<p>4.不会被并发访问的数据</p>
<p>5.部署很重要的数据，允许出现偶尔并发的数据</p>
<p>扩展：hibernate的二级缓存，默认不支持分布式缓存的。使用 memche，redis等中央缓存来代替二级缓存</p>
</li>
</ul>
<hr>
<p> Q：有没有做过数据库优化的工作</p>
<p>  A：优化手段</p>
<p>   1.查找，定位，慢查询，并优化</p>
<p>   2.创建索引：创建合适的索引，我们就可以在索引中查询，查询以后直接找对应的记录</p>
<p>   3.分表：当一张表的数据比较多或者一张表的某些字段的值比较多并且很少使用时，采用水平分表和垂直分表来优化</p>
<p>   4.读写分离：一台服务器不能满足需求时，采用读写分离的方式进行集群</p>
<p>   5.缓存：使用redis来进行缓存</p>
<hr>
<ul>
<li><p>Q：查找和定位慢查询</p>
<p>A：在项目自验，或者项目转测试之前，在启动mysql数据库时，开启慢查询，把执行慢的语句写到日志中，在运行一定的时间后，查找日志，通过查看日志找到慢查询语句</p>
<p>使用explain+慢查询语句来详细分析语句的问题</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：数据库表设计需要遵循范式</p>
<p>A：</p>
<p>1NF：列原子性，不可分</p>
<p>2NF：主键</p>
<p>3NF：外键</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：数据库合适的存储引擎</p>
<p>myisam事务要求不高，添加和查询为主</p>
<p>innodb对事务要求高，保持数据是重要数据，innodb</p>
<p>memory 我们数据变化频繁，同时需要查询和修改，速度极快</p>
<p>myisam和innodb</p>
<p>1.myisam不支持事务，</p>
<p>2.mysiam查询速度快，没有同步锁</p>
<p>3mysiam支持全文索引</p>
<p>4.mysiam支持表锁，而innodb支持行锁</p>
<p>5.mysiam不支持外键，</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：&#x3D;&#x3D;数据库优化之创建索引&#x3D;&#x3D;</p>
<p>A：</p>
<p>1.普通索引 </p>
<p>2.唯一索引，不能重复（用户名，身份证，tel）</p>
<p>3.主键索引，随中建而创建，就是把某一列设为主键的时候，数据库就会给该列创建索引</p>
<p>4.全文索引，用来对表中文本域（char，var char，text）进行索引，针对mysiam</p>
<p>索引使用的小技巧：</p>
<p>不是频繁使用的多个值</p>
<p>弊端：直接导致再用空间，dml（插入，修改，删除）操作有影响，变慢</p>
<p>a：肯定是在where条件经常使用，如果不做查询就没有意义</p>
<p>b：该字段的内容部署唯一的几个值</p>
<p>c：字段的内容不是频繁变化的多个值</p>
<p>技巧：</p>
<p>1.对创建复合索引（多列索引），不是使用的第一部分就不会使用索引</p>
<p>2.对于使用like的查询，查询如果是”%aaa“</p>
<p>3.有or，有条件没有使用索引，其实其中有条件带索引也不会使用</p>
<p>4.如果列类型是字符串，那一定要做条件中将数据使用引号引用起来，否则不使用索引</p>
<p>5.如果myql估计使用全表扫描要比使用索引快，则不用索引</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：数据库优化的分表技术</p>
<p>A：水平分表（行），垂直分表（列）</p>
<p>mysql百万级别会表锁</p>
<p>如果一张表中某个字段的值非常多（字符串，长文本，二进制），而且在很少的情况下会查询，我们的考试详情，一般我们只关注分数，不关注详情，</p>
<p>把详情隔离出来，把字段多的单独放一个表，通过外键关联起来</p>
<p>水平分表策略：</p>
<p>1.看时间应该分表，很强的时效性，</p>
<p>2.按区间范围进行分表</p>
<p>3.hash分表</p>
</li>
</ul>
<hr>
<ul>
<li>Q：数据库优化之读写分离<br>A：一泰数据库支持的并发连接时有限的，如果用户并发访问太多，一台服务器满足不了要求，就可以集群处理，mysql的集群处理技术，最常用的是读写分离</li>
</ul>
<h2 id="主从同步：-数据库最终会把数据持久化到磁盘，如果集群必须保证每一个服务器的数据是一致的。能改变数据库的操作往主数据去写，而其他人的数据库上同步数据-读写分离：-使用负载均衡来实现写的操作都往主数据去，而读的操作往从服务器去读"><a href="#主从同步：-数据库最终会把数据持久化到磁盘，如果集群必须保证每一个服务器的数据是一致的。能改变数据库的操作往主数据去写，而其他人的数据库上同步数据-读写分离：-使用负载均衡来实现写的操作都往主数据去，而读的操作往从服务器去读" class="headerlink" title=" 主从同步： 数据库最终会把数据持久化到磁盘，如果集群必须保证每一个服务器的数据是一致的。能改变数据库的操作往主数据去写，而其他人的数据库上同步数据 读写分离： 使用负载均衡来实现写的操作都往主数据去，而读的操作往从服务器去读"></a> 主从同步：<br><br> 数据库最终会把数据持久化到磁盘，如果集群必须保证每一个服务器的数据是一致的。能改变数据库的操作往主数据去写，而其他人的数据库上同步数据<br><br> 读写分离：<br> 使用负载均衡来实现写的操作都往主数据去，而读的操作往从服务器去读</h2><ul>
<li><p>Q：数据库优化之缓存<br>A：持久层（Dao）和数据库（db）之前添加一个缓存层，</p>
<p>作用：减小数据库压力，减少访问时间</p>
<p>java中常用的缓存：<br>  hibernate不支持分布式缓存</p>
<p>  加一层redis，使用redis作为中央缓存</p>
<p>  对缓存的数据进行集中处理</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：语句的优化<br>A：&#x3D;&#x3D;DDL优化&#x3D;&#x3D; </p>
<p>1.通过禁用索引来导入数据库性能，</p>
<p>2.关闭唯一校验</p>
<p>3.修改事务提交方式（变多次提交为一次）<br>set autocommit&#x3D;0 关闭<br>set autocommit&#x3D;1 开启</p>
</li>
</ul>
<h2 id="DML优化-：-合并多条为一条-DQL优化：-Order-by优化，-跨表查询"><a href="#DML优化-：-合并多条为一条-DQL优化：-Order-by优化，-跨表查询" class="headerlink" title=" &#x3D;&#x3D; DML优化&#x3D;&#x3D;：  合并多条为一条  DQL优化：  Order by优化，&#x3D;&#x3D;跨表查询&#x3D;&#x3D;"></a> &#x3D;&#x3D; DML优化&#x3D;&#x3D;：<br>  合并多条为一条<br><br>  DQL优化：<br><br>  Order by优化，&#x3D;&#x3D;跨表查询&#x3D;&#x3D;</h2><ul>
<li><p>Q：批量插入几百万条数据 </p>
<p>A：原理：变多次提交为一次提交，使用批量操作，整体提交</p>
<p>省出的时间非常可观，想这样的批量插入操作不使用代码，可以写&#x3D;&#x3D;存储过程&#x3D;&#x3D;</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：有没有用过redis？redis是什么</p>
<p>A：redis是一个key-value的nosql数据库，会根据一定的策略持久话到磁盘，即使断电也不会丢失数据</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：redis的使用场景</p>
<p>A：经常需要查询的数据，很少修改，放到读速度<br>很快的空间（内存)</p>
<p>redis中的计数器是原子性的内存操作</p>
<p>可以解决库存溢出的问题</p>
<p>session 缓存服务器：存放tomcat的session</p>
<p>并发队列</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：redis对象的保存方式</p>
<p>A：</p>
<p>  json字符串：需要手动转换为json字符串，当做字符串处理，直接使用set和get来设置或者获取。</p>
<p>  有点：设置和获取比较简单</p>
<p>  缺点：没有提供专门的方法，需要把对转换成jsoson（jsonlib）</p>
<p>  字节：需要做&#x3D;&#x3D;序列化&#x3D;&#x3D;，把对象序列化为字节保存，</p>
<p>  JSON转对象消耗资源的问题：</p>
<p>  1.使用json转换lib是否存在性能问题</p>
<p>  2.百万大数据，建议才用存储序列化对象。如果是少量数据对象，建议JSON转换成String方式</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：redis的数据淘汰机制</p>
<p>A：redis允许用户设置最大内存使用server。</p>
<p>  数据超过内存限制，需要操作有效的数据。</p>
<p>  &#x3D;&#x3D;挑选最少使用的数据进行淘汰&#x3D;&#x3D;</p>
<p>  过期的数据，挑选使用少使用</p>
</li>
</ul>
<hr>
<ul>
<li><p>Q：java访问redis<br>A：</p>
<p>  jedis java客服端来访问，类似于jdbc访问mysql，spring集成时，spring  data来访问redis。spring data对jedis的二次封装</p>
</li>
</ul>
<hr>
<ul>
<li><p>&#x3D;&#x3D;Q：JDBC中的PreparedStatement相对Statement&#x3D;&#x3D;</p>
<p>A：<br>   1.PreparedStatement是预编译，比Statement速度快</p>
<p>   2.PreparedStatement可读性</p>
<p>   3.安全性PreparedStatement高，防止sql攻击，对原来的语句发生过滤</p>
</li>
</ul>
<hr>
<ul>
<li>数据库会死锁吗，举一个死锁的例子，mysql 怎么解决死锁。</li>
</ul>
<p>产生死锁的原因主要是：<br>系统资源不足。<br>进程运行推进的顺序不合适。<br>资源分配不当等。<br>如果系统资源充足，进程的资源请求都能够得到满足，死锁出现的可能性就很低，否则就会因争夺有限的资源而陷入死锁。其次，进程运行推进顺序与速度不同，也可能产生死锁。</p>
<p>产生死锁的四个必要条件：<br>互斥条件：一个资源每次只能被一个进程使用。<br>请求与保持条件：一个进程因请求资源而阻塞时，对已获得的资源保持不放。<br>不剥夺条件：进程已获得的资源，在末使用完之前，不能强行剥夺。<br>循环等待条件：若干进程之间形成一种头尾相接的循环等待资源关系。<br>这四个条件是死锁的必要条件，只要系统发生死锁，这些条件必然成立，而只要上述条件之一不满足，就不会发生死锁。 </p>
<p>解决数据库死锁的方法：<br>重启数据库。<br>杀掉抢资源的进程。</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://caoleili.gitee.io/cll-blog/2023/10/10/database/" data-id="clnkilhce0000ksvbag96704z" data-title="database" class="article-share-link"><span class="fa fa-share">Teilen</span></a>
      
      
      
    </footer>
  </div>
  
    
  
</article>


</section>
        
          <aside id="sidebar">
  
    

  
    

  
    
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archiv</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/cll-blog/archives/2023/10/">October 2023</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">letzter Beitrag</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/cll-blog/2023/10/10/database/">database</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      
      &copy; 2023 cll<br>
      Powered by <a href="https://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>

    </div>
    <nav id="mobile-nav">
  
    <a href="/cll-blog/" class="mobile-nav-link">Home</a>
  
    <a href="/cll-blog/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    


<script src="/cll-blog/js/jquery-3.6.4.min.js"></script>



  
<script src="/cll-blog/fancybox/jquery.fancybox.min.js"></script>




<script src="/cll-blog/js/script.js"></script>





  </div>
</body>
</html>